/**
 * 版权所有(C)，上海勾芒信息科技，2016，所有权利保留。
 * 
 * 项目名：	car-web
 * 文件名：	HTMLParser.java
 * 模块说明：	
 * 修改历史：
 * 2016年12月21日 - Debenson - 创建。
 */
package com.alex.wechat.mp.message.news.service;

import java.io.File;
import java.net.URL;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.htmlparser.Parser;
import org.htmlparser.Tag;
import org.htmlparser.Text;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.visitors.UrlModifyingVisitor;
import org.jeecgframework.p3.core.utils.common.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.gomore.jeecg.util.RandomUtils;

import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult;

/**
 * 由于微信不允许在图文消息中使用外部链接的图片， 所以我们需要将这类图片的url修改成上传微信后获得的url。
 * 
 * @author Debenson
 * @since 0.1
 */
public class WxArticleResolver {
  private static final Logger logger = Logger.getLogger(WxArticleResolver.class);

  @Autowired
  private WxMpService wxMpService;

  /**
   * 解析文本内容并替换img节点的src属性。
   * 
   * @param content
   * @return
   */
  public String resolve(String content) {
    if (StringUtils.isBlank(content)) {
      return content;
    }

    // 添加DOM根节点
    if (!content.contains("<html>") || !content.contains("<body>")) {
      content = "<html><body>" + content + "</body></html>";
    }

    Parser parser = Parser.createParser(content, "UTF-8");
    ImgSrcModifier modifier = new ImgSrcModifier();
    try {
      parser.visitAllNodesWith(modifier);
    } catch (Exception e) {
      logger.error("", e);
      return content;
    }
    String html = modifier.getModifiedResult();
    return html;
  }

  /**
   * 用来修改img的scr属性。
   * 
   * @author Debenson
   * @since 0.1
   */
  private class ImgSrcModifier extends UrlModifyingVisitor {

    public ImgSrcModifier() {
      super("");
    }

    @Override
    public void visitStringNode(Text stringNode) {
      // 这个必须重载。
    }

    @Override
    public void visitTag(Tag tag) {
      if (tag instanceof ImageTag) {
        try {
          modifyImgSrc(tag);
        } catch (Exception e) {
          logger.error("", e);
          super.visitTag(tag);
        }
      } else {
        super.visitTag(tag);
      }
    }

    private void modifyImgSrc(Tag tag) throws Exception {
      ImageTag imgTag = (ImageTag) tag;
      final String src = imgTag.getImageURL();

      String fileName = RandomUtils.randomString(10);
      String fileExt = null;
      try {
        int index = src.lastIndexOf(".");
        if (index >= 0) {
          fileExt = src.substring(index);
        }
      } catch (Exception e) {
      }

      File imgFile = File.createTempFile(fileName, fileExt);
      FileUtils.copyURLToFile(new URL(src), imgFile);

      WxMediaImgUploadResult res = wxMpService.getMaterialService().mediaImgUpload(imgFile);
      imgTag.setImageURL(res.getUrl());
    }

  }

}
